home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / EXEC.SWG / 0007_FIND AND EXECUTE.pas < prev    next >
Pascal/Delphi Source File  |  1993-10-28  |  3KB  |  169 lines

  1. {$S-,R-,V-,I-,N-,B-,F-}
  2.  
  3. {$IFNDEF Ver40}
  4.   {Allow overlays}
  5.   {$F+,O-,X+,A-}
  6. {$ENDIF}
  7.  
  8. UNIT FINDEXEC;
  9.  
  10. INTERFACE
  11.  
  12. USES CRT,DOS;
  13.  
  14. PROCEDURE FLUSHALLDOS;
  15. PROCEDURE REBOOT;
  16. FUNCTION  EXECUTE (Name : PathStr ; Tail : STRING) : WORD;
  17. PROCEDURE RunInWindow (FN, Cmd : STRING; PAUSE : BOOLEAN);
  18.  
  19. IMPLEMENTATION
  20. VAR
  21.      cname   : STRING;
  22.      Old_29H : POINTER;
  23.  
  24. PROCEDURE FLUSHALLDOS; ASSEMBLER;
  25. ASM
  26.   mov   ah, 0Dh
  27.   INT   21h
  28.   XOR   cx, cx
  29. @1 :
  30.   push  cx
  31.   INT   28h
  32.   pop   cx
  33.   loop  @1
  34. END;
  35.  
  36. PROCEDURE Reboot; assembler;
  37. asm
  38.   CALL  FLUSHALLDOS
  39.   MOV   ds, cx
  40.   MOV   WORD PTR [472h], 1234h
  41.   DEC   cx
  42.   PUSH  cx
  43.   PUSH  ds
  44. END;
  45.  
  46. {F+}
  47. Procedure Int29Handler(AX, BX, CX, DX, SI, DI, DS, ES, BP : Word); Interrupt;
  48. Var
  49.   Dummy : Byte;
  50. begin
  51.   Asm
  52.     Sti
  53.   end;
  54.   Write(Char(Lo(Ax)));
  55.   Asm
  56.     Cli
  57.   end;
  58. end;
  59. {$F-}
  60.  
  61. {   EXECUTE STUFF - SHRINK HEAP AND EXECUTE LIKE EXECDOS }
  62.  
  63. PROCEDURE ReallocateMemory (P : POINTER); ASSEMBLER;
  64. ASM
  65.   MOV  AX, PrefixSeg
  66.   MOV  ES, AX
  67.   MOV  BX, WORD PTR P + 2
  68.   CMP  WORD PTR P, 0
  69.   JE   @OK
  70.   INC  BX
  71.  
  72.  @OK :
  73.   SUB  BX, AX
  74.   MOV  AH, 4Ah
  75.   INT  21h
  76.   JC   @X
  77.   LES  DI, P
  78.   MOV  WORD PTR HeapEnd, DI
  79.   MOV  WORD PTR HeapEnd + 2, ES
  80.  @X :
  81. END;
  82.  
  83. { ZAP this DEFINE if NOT 386,486}
  84. {..$DEFINE CPU386}
  85.  
  86. FUNCTION EXEC (Name : PathStr ; Tail : STRING) : WORD; ASSEMBLER;
  87. ASM
  88.   CALL    FLUSHALLDOS
  89.   {$IFDEF CPU386}
  90.   DB      66h
  91.   PUSH    WORD PTR HeapEnd
  92.   DB      66h
  93.   PUSH    WORD PTR Name
  94.   DB      66h
  95.   PUSH    WORD PTR Tail
  96.   DB      66h
  97.   PUSH    WORD PTR HeapPtr
  98.   {$ELSE}
  99.   PUSH    WORD PTR HeapEnd + 2
  100.   PUSH    WORD PTR HeapEnd
  101.   PUSH    WORD PTR Name + 2
  102.   PUSH    WORD PTR Name
  103.   PUSH    WORD PTR Tail + 2
  104.   PUSH    WORD PTR Tail
  105.   PUSH    WORD PTR HeapPtr + 2
  106.   PUSH    WORD PTR HeapPtr
  107.  
  108.   {$ENDIF}
  109.  
  110.   CALL ReallocateMemory
  111.   CALL SwapVectors
  112.   CALL DOS.EXEC
  113.   CALL SwapVectors
  114.   CALL ReallocateMemory
  115.   MOV  AX, DosError
  116.   OR   AX, AX
  117.   JNZ  @OUT
  118.   MOV  AH, 4Dh
  119.   INT  21h
  120.  
  121.  @OUT :
  122.  
  123. END;
  124.  
  125. FUNCTION EXECUTE (Name : PathStr ; Tail : STRING)  : WORD;
  126. VAR W : PathStr;
  127. BEGIN
  128.  DosError := 2;
  129.  W := FSEARCH (Name, GetEnv ('PATH') );
  130.  IF W = '' THEN EXIT;
  131.  EXECUTE := EXEC(W,Tail);
  132. END;
  133.  
  134. PROCEDURE RunInWindow (FN, Cmd : STRING; PAUSE : BOOLEAN);
  135.  
  136. VAR sa : BYTE;
  137.     w  : pathstr;
  138.  
  139. BEGIN
  140.  
  141.  DosError := 2;
  142.  W := FSEARCH (fn, GetEnv ('PATH') );
  143.  IF W = '' THEN EXIT;
  144.  sa       := Textattr;
  145.  
  146.  GETINTVEC ($29, OLD_29H);
  147.  SETINTVEC ($29, @Int29Handler);         { Install interrupt handler }
  148.  WINDOW (LO (WindMin) + 1, HI (WindMin) + 1, LO (WindMax) + 1, HI (WindMax) + 1);
  149.  EXEC (W, Cmd );
  150.  SETINTVEC ($29, OLD_29h);
  151.  
  152.  IF PAUSE THEN
  153.     BEGIN
  154.     WRITELN;
  155.     WRITELN (' .. Any Key Continues .. ');
  156.     asm
  157.       Mov AX, $0C00;               { flush keyboard }
  158.       Int 21h;
  159.     end;
  160.     WHILE NOT KEYPRESSED DO;
  161.     asm
  162.       Mov AX, $0C00;
  163.       Int 21h;
  164.     end;
  165.     END;
  166.  Textattr := sa;
  167. END;
  168.  
  169. END.